#!/bin/bash
# ==============================================
#  Shell 编程核心知识点演示脚本
#  适合学习场景：变量、输入输出、条件判断、循环、函数、数组、文件测试
#  运行方式：./shell_learning_demo.sh
#  知识点覆盖：10+ 个 Shell 核心语法
# ==============================================

# --------------------------
# 1. 变量定义与输出（基础）
# --------------------------
echo -e "\n===== 1. 变量定义与输出 ====="
# 普通变量（字符串/数字）
name="Shell 学习者"
age=25
echo "姓名：$name"          # 变量引用：$变量名
echo "年龄：${age}岁"       # 花括号{}：明确变量边界（推荐）
echo "拼接字符串：Hello, $name! 你已学习 Shell 编程 ${age} 天～"

# 环境变量（系统内置）
echo "当前用户：$USER"      # 当前登录用户
echo "家目录：$HOME"        # 用户家目录
echo "当前工作目录：$PWD"   # 当前所在目录

# --------------------------
# 2. 读取用户输入（交互）
# --------------------------
echo -e "\n===== 2. 读取用户输入 ====="
read -p "请输入你的爱好（如：编程、阅读）：" hobby  # -p：输入提示
read -p "请输入你喜欢的 3 个数字（空格分隔）：" -a nums  # -a：读取为数组

echo "你的爱好是：$hobby"
echo "你喜欢的数字数组：${nums[@]}"  # 数组所有元素
echo "数组长度：${#nums[@]}"        # 数组长度（元素个数）

# --------------------------
# 3. 条件判断（if-elif-else）
# --------------------------
echo -e "\n===== 3. 条件判断 ====="
# 3.1 字符串判断
if [ -z "$hobby" ]; then  # -z：判断字符串为空
    echo "警告：你未输入爱好！"
elif [ "$hobby" = "编程" ]; then  # =：字符串相等
    echo "👍 编程是个很棒的爱好，适合学习 Shell！"
else
    echo "👍 你的爱好 $hobby 也很有趣～"
fi

# 3.2 数字判断（用 (( )) 算术上下文）
num1=10
num2=20
if (( num1 > num2 )); then
    echo "$num1 > $num2"
elif (( num1 == num2 )); then
    echo "$num1 == $num2"
else
    echo "$num1 < $num2"
fi

# 3.3 文件测试（用 [ ] 测试运算符）
test_file="shell_learning_demo.sh"
if [ -f "$test_file" ]; then  # -f：判断普通文件
    echo "文件 $test_file 存在，是普通文件"
    echo "文件行数：$(wc -l < "$test_file")"  # 命令替换：$()
fi

# --------------------------
# 4. 循环（for/while）
# --------------------------
echo -e "\n===== 4. 循环演示 ====="
# 4.1 for 循环（遍历数组）
echo "4.1 遍历爱好数组（模拟多爱好）："
hobbies=("编程" "阅读" "运动" "听音乐")
for h in "${hobbies[@]}"; do  # 遍历数组，保留元素边界
    echo "  - $h"
done

# 4.2 for 循环（数字范围）
echo "4.2 输出 1-5 的平方："
for (( i=1; i<=5; i++ )); do  # C 风格 for 循环
    echo "  $i 的平方 = $((i*i))"  # 算术运算：$(( ))
done

# 4.3 while 循环（累加）
echo "4.3 1-10 的累加和："
sum=0
i=1
while (( i <= 10 )); do
    sum=$((sum + i))
    ((i++))  # 自增
done
echo "  累加和 = $sum"

# --------------------------
# 5. 函数定义与调用
# --------------------------
echo -e "\n===== 5. 函数演示 ====="
# 定义函数：计算两数之和
add() {
    # 函数参数：$1 第一个参数，$2 第二个参数
    local a=$1  # local：局部变量（仅函数内有效）
    local b=$2
    echo $((a + b))  # 函数返回值（通过 echo 输出）
}

# 调用函数
result=$(add 15 25)  # 捕获函数输出作为返回值
echo "5.1 15 + 25 = $result"

# 定义函数：判断文件是否可读
check_file_readable() {
    local file=$1
    if [ -r "$file" ]; then  # -r：判断文件可读
        echo "文件 $file 可读"
    else
        echo "文件 $file 不可读或不存在"
    fi
}
check_file_readable "$test_file"
check_file_readable "nonexistent_file.txt"

# --------------------------
# 6. 数组进阶操作
# --------------------------
echo -e "\n===== 6. 数组进阶 ====="
# 数组追加元素
hobbies+=("旅行")  # 末尾追加
echo "追加后的爱好数组：${hobbies[@]}"

# 访问单个元素（索引从 0 开始）
echo "数组第 3 个元素（索引 2）：${hobbies[2]}"

# 数组切片（截取前 3 个元素）
echo "数组前 3 个元素：${hobbies[@]:0:3}"  # 格式：${数组[@]:起始索引:长度}

# --------------------------
# 7. 脚本退出状态码
# --------------------------
echo -e "\n===== 7. 退出状态码 ====="
# 执行成功：exit 0；失败：exit 非 0
if [ -f "$test_file" ]; then
    echo "脚本执行成功！"
    exit 0  # 正常退出
else
    echo "脚本执行失败：文件不存在！"
    exit 1  # 异常退出
fi
